home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / scsi / iscsi_proto.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  14.9 KB  |  621 lines

  1. /*
  2.  * RFC 3720 (iSCSI) protocol data types
  3.  *
  4.  * Copyright (C) 2005 Dmitry Yusupov
  5.  * Copyright (C) 2005 Alex Aizman
  6.  * maintained by open-iscsi@googlegroups.com
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published
  10.  * by the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful, but
  14.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16.  * General Public License for more details.
  17.  *
  18.  * See the file COPYING included with this distribution for more details.
  19.  */
  20.  
  21. #ifndef ISCSI_PROTO_H
  22. #define ISCSI_PROTO_H
  23.  
  24. #include <linux/types.h>
  25. #include <scsi/scsi.h>
  26.  
  27. #define ISCSI_DRAFT20_VERSION    0x00
  28.  
  29. /* default iSCSI listen port for incoming connections */
  30. #define ISCSI_LISTEN_PORT    3260
  31.  
  32. /* Padding word length */
  33. #define ISCSI_PAD_LEN        4
  34.  
  35. /*
  36.  * useful common(control and data pathes) macro
  37.  */
  38. #define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))
  39. #define hton24(p, v) { \
  40.         p[0] = (((v) >> 16) & 0xFF); \
  41.         p[1] = (((v) >> 8) & 0xFF); \
  42.         p[2] = ((v) & 0xFF); \
  43. }
  44. #define zero_data(p) {p[0]=0;p[1]=0;p[2]=0;}
  45.  
  46. /* initiator tags; opaque for target */
  47. typedef uint32_t __bitwise__ itt_t;
  48. /* below makes sense only for initiator that created this tag */
  49. #define build_itt(itt, age) ((__force itt_t)\
  50.     ((itt) | ((age) << ISCSI_AGE_SHIFT)))
  51. #define get_itt(itt) ((__force uint32_t)(itt_t)(itt) & ISCSI_ITT_MASK)
  52. #define RESERVED_ITT ((__force itt_t)0xffffffff)
  53.  
  54. /*
  55.  * iSCSI Template Message Header
  56.  */
  57. struct iscsi_hdr {
  58.     uint8_t        opcode;
  59.     uint8_t        flags;        /* Final bit */
  60.     uint8_t        rsvd2[2];
  61.     uint8_t        hlength;    /* AHSs total length */
  62.     uint8_t        dlength[3];    /* Data length */
  63.     uint8_t        lun[8];
  64.     itt_t        itt;        /* Initiator Task Tag, opaque for target */
  65.     __be32        ttt;        /* Target Task Tag */
  66.     __be32        statsn;
  67.     __be32        exp_statsn;
  68.     __be32        max_statsn;
  69.     uint8_t        other[12];
  70. };
  71.  
  72. /************************* RFC 3720 Begin *****************************/
  73.  
  74. #define ISCSI_RESERVED_TAG        0xffffffff
  75.  
  76. /* Opcode encoding bits */
  77. #define ISCSI_OP_RETRY            0x80
  78. #define ISCSI_OP_IMMEDIATE        0x40
  79. #define ISCSI_OPCODE_MASK        0x3F
  80.  
  81. /* Initiator Opcode values */
  82. #define ISCSI_OP_NOOP_OUT        0x00
  83. #define ISCSI_OP_SCSI_CMD        0x01
  84. #define ISCSI_OP_SCSI_TMFUNC        0x02
  85. #define ISCSI_OP_LOGIN            0x03
  86. #define ISCSI_OP_TEXT            0x04
  87. #define ISCSI_OP_SCSI_DATA_OUT        0x05
  88. #define ISCSI_OP_LOGOUT            0x06
  89. #define ISCSI_OP_SNACK            0x10
  90.  
  91. #define ISCSI_OP_VENDOR1_CMD        0x1c
  92. #define ISCSI_OP_VENDOR2_CMD        0x1d
  93. #define ISCSI_OP_VENDOR3_CMD        0x1e
  94. #define ISCSI_OP_VENDOR4_CMD        0x1f
  95.  
  96. /* Target Opcode values */
  97. #define ISCSI_OP_NOOP_IN        0x20
  98. #define ISCSI_OP_SCSI_CMD_RSP        0x21
  99. #define ISCSI_OP_SCSI_TMFUNC_RSP    0x22
  100. #define ISCSI_OP_LOGIN_RSP        0x23
  101. #define ISCSI_OP_TEXT_RSP        0x24
  102. #define ISCSI_OP_SCSI_DATA_IN        0x25
  103. #define ISCSI_OP_LOGOUT_RSP        0x26
  104. #define ISCSI_OP_R2T            0x31
  105. #define ISCSI_OP_ASYNC_EVENT        0x32
  106. #define ISCSI_OP_REJECT            0x3f
  107.  
  108. struct iscsi_ahs_hdr {
  109.     __be16 ahslength;
  110.     uint8_t ahstype;
  111.     uint8_t ahspec[5];
  112. };
  113.  
  114. #define ISCSI_AHSTYPE_CDB        1
  115. #define ISCSI_AHSTYPE_RLENGTH        2
  116. #define ISCSI_CDB_SIZE            16
  117.  
  118. /* iSCSI PDU Header */
  119. struct iscsi_cmd {
  120.     uint8_t opcode;
  121.     uint8_t flags;
  122.     __be16 rsvd2;
  123.     uint8_t hlength;
  124.     uint8_t dlength[3];
  125.     uint8_t lun[8];
  126.     itt_t     itt;    /* Initiator Task Tag */
  127.     __be32 data_length;
  128.     __be32 cmdsn;
  129.     __be32 exp_statsn;
  130.     uint8_t cdb[ISCSI_CDB_SIZE];    /* SCSI Command Block */
  131.     /* Additional Data (Command Dependent) */
  132. };
  133.  
  134. /* Command PDU flags */
  135. #define ISCSI_FLAG_CMD_FINAL        0x80
  136. #define ISCSI_FLAG_CMD_READ        0x40
  137. #define ISCSI_FLAG_CMD_WRITE        0x20
  138. #define ISCSI_FLAG_CMD_ATTR_MASK    0x07    /* 3 bits */
  139.  
  140. /* SCSI Command Attribute values */
  141. #define ISCSI_ATTR_UNTAGGED        0
  142. #define ISCSI_ATTR_SIMPLE        1
  143. #define ISCSI_ATTR_ORDERED        2
  144. #define ISCSI_ATTR_HEAD_OF_QUEUE    3
  145. #define ISCSI_ATTR_ACA            4
  146.  
  147. struct iscsi_rlength_ahdr {
  148.     __be16 ahslength;
  149.     uint8_t ahstype;
  150.     uint8_t reserved;
  151.     __be32 read_length;
  152. };
  153.  
  154. /* Extended CDB AHS */
  155. struct iscsi_ecdb_ahdr {
  156.     __be16 ahslength;    /* CDB length - 15, including reserved byte */
  157.     uint8_t ahstype;
  158.     uint8_t reserved;
  159.     /* 4-byte aligned extended CDB spillover */
  160.     uint8_t ecdb[SCSI_MAX_VARLEN_CDB_SIZE - ISCSI_CDB_SIZE];
  161. };
  162.  
  163. /* SCSI Response Header */
  164. struct iscsi_cmd_rsp {
  165.     uint8_t opcode;
  166.     uint8_t flags;
  167.     uint8_t response;
  168.     uint8_t cmd_status;
  169.     uint8_t hlength;
  170.     uint8_t dlength[3];
  171.     uint8_t rsvd[8];
  172.     itt_t     itt;    /* Initiator Task Tag */
  173.     __be32    rsvd1;
  174.     __be32    statsn;
  175.     __be32    exp_cmdsn;
  176.     __be32    max_cmdsn;
  177.     __be32    exp_datasn;
  178.     __be32    bi_residual_count;
  179.     __be32    residual_count;
  180.     /* Response or Sense Data (optional) */
  181. };
  182.  
  183. /* Command Response PDU flags */
  184. #define ISCSI_FLAG_CMD_BIDI_OVERFLOW    0x10
  185. #define ISCSI_FLAG_CMD_BIDI_UNDERFLOW    0x08
  186. #define ISCSI_FLAG_CMD_OVERFLOW        0x04
  187. #define ISCSI_FLAG_CMD_UNDERFLOW    0x02
  188.  
  189. /* iSCSI Status values. Valid if Rsp Selector bit is not set */
  190. #define ISCSI_STATUS_CMD_COMPLETED    0
  191. #define ISCSI_STATUS_TARGET_FAILURE    1
  192. #define ISCSI_STATUS_SUBSYS_FAILURE    2
  193.  
  194. /* Asynchronous Event Header */
  195. struct iscsi_async {
  196.     uint8_t opcode;
  197.     uint8_t flags;
  198.     uint8_t rsvd2[2];
  199.     uint8_t rsvd3;
  200.     uint8_t dlength[3];
  201.     uint8_t lun[8];
  202.     uint8_t rsvd4[8];
  203.     __be32    statsn;
  204.     __be32    exp_cmdsn;
  205.     __be32    max_cmdsn;
  206.     uint8_t async_event;
  207.     uint8_t async_vcode;
  208.     __be16    param1;
  209.     __be16    param2;
  210.     __be16    param3;
  211.     uint8_t rsvd5[4];
  212. };
  213.  
  214. /* iSCSI Event Codes */
  215. #define ISCSI_ASYNC_MSG_SCSI_EVENT            0
  216. #define ISCSI_ASYNC_MSG_REQUEST_LOGOUT            1
  217. #define ISCSI_ASYNC_MSG_DROPPING_CONNECTION        2
  218. #define ISCSI_ASYNC_MSG_DROPPING_ALL_CONNECTIONS    3
  219. #define ISCSI_ASYNC_MSG_PARAM_NEGOTIATION        4
  220. #define ISCSI_ASYNC_MSG_VENDOR_SPECIFIC            255
  221.  
  222. /* NOP-Out Message */
  223. struct iscsi_nopout {
  224.     uint8_t opcode;
  225.     uint8_t flags;
  226.     __be16    rsvd2;
  227.     uint8_t rsvd3;
  228.     uint8_t dlength[3];
  229.     uint8_t lun[8];
  230.     itt_t     itt;    /* Initiator Task Tag */
  231.     __be32    ttt;    /* Target Transfer Tag */
  232.     __be32    cmdsn;
  233.     __be32    exp_statsn;
  234.     uint8_t rsvd4[16];
  235. };
  236.  
  237. /* NOP-In Message */
  238. struct iscsi_nopin {
  239.     uint8_t opcode;
  240.     uint8_t flags;
  241.     __be16    rsvd2;
  242.     uint8_t rsvd3;
  243.     uint8_t dlength[3];
  244.     uint8_t lun[8];
  245.     itt_t     itt;    /* Initiator Task Tag */
  246.     __be32    ttt;    /* Target Transfer Tag */
  247.     __be32    statsn;
  248.     __be32    exp_cmdsn;
  249.     __be32    max_cmdsn;
  250.     uint8_t rsvd4[12];
  251. };
  252.  
  253. /* SCSI Task Management Message Header */
  254. struct iscsi_tm {
  255.     uint8_t opcode;
  256.     uint8_t flags;
  257.     uint8_t rsvd1[2];
  258.     uint8_t hlength;
  259.     uint8_t dlength[3];
  260.     uint8_t lun[8];
  261.     itt_t     itt;    /* Initiator Task Tag */
  262.     itt_t     rtt;    /* Reference Task Tag */
  263.     __be32    cmdsn;
  264.     __be32    exp_statsn;
  265.     __be32    refcmdsn;
  266.     __be32    exp_datasn;
  267.     uint8_t rsvd2[8];
  268. };
  269.  
  270. #define ISCSI_FLAG_TM_FUNC_MASK            0x7F
  271.  
  272. /* Function values */
  273. #define ISCSI_TM_FUNC_ABORT_TASK        1
  274. #define ISCSI_TM_FUNC_ABORT_TASK_SET        2
  275. #define ISCSI_TM_FUNC_CLEAR_ACA            3
  276. #define ISCSI_TM_FUNC_CLEAR_TASK_SET        4
  277. #define ISCSI_TM_FUNC_LOGICAL_UNIT_RESET    5
  278. #define ISCSI_TM_FUNC_TARGET_WARM_RESET        6
  279. #define ISCSI_TM_FUNC_TARGET_COLD_RESET        7
  280. #define ISCSI_TM_FUNC_TASK_REASSIGN        8
  281.  
  282. /* SCSI Task Management Response Header */
  283. struct iscsi_tm_rsp {
  284.     uint8_t opcode;
  285.     uint8_t flags;
  286.     uint8_t response;    /* see Response values below */
  287.     uint8_t qualifier;
  288.     uint8_t hlength;
  289.     uint8_t dlength[3];
  290.     uint8_t rsvd2[8];
  291.     itt_t     itt;    /* Initiator Task Tag */
  292.     itt_t     rtt;    /* Reference Task Tag */
  293.     __be32    statsn;
  294.     __be32    exp_cmdsn;
  295.     __be32    max_cmdsn;
  296.     uint8_t rsvd3[12];
  297. };
  298.  
  299. /* Response values */
  300. #define ISCSI_TMF_RSP_COMPLETE        0x00
  301. #define ISCSI_TMF_RSP_NO_TASK        0x01
  302. #define ISCSI_TMF_RSP_NO_LUN        0x02
  303. #define ISCSI_TMF_RSP_TASK_ALLEGIANT    0x03
  304. #define ISCSI_TMF_RSP_NO_FAILOVER    0x04
  305. #define ISCSI_TMF_RSP_NOT_SUPPORTED    0x05
  306. #define ISCSI_TMF_RSP_AUTH_FAILED    0x06
  307. #define ISCSI_TMF_RSP_REJECTED        0xff
  308.  
  309. /* Ready To Transfer Header */
  310. struct iscsi_r2t_rsp {
  311.     uint8_t opcode;
  312.     uint8_t flags;
  313.     uint8_t rsvd2[2];
  314.     uint8_t    hlength;
  315.     uint8_t    dlength[3];
  316.     uint8_t lun[8];
  317.     itt_t     itt;    /* Initiator Task Tag */
  318.     __be32    ttt;    /* Target Transfer Tag */
  319.     __be32    statsn;
  320.     __be32    exp_cmdsn;
  321.     __be32    max_cmdsn;
  322.     __be32    r2tsn;
  323.     __be32    data_offset;
  324.     __be32    data_length;
  325. };
  326.  
  327. /* SCSI Data Hdr */
  328. struct iscsi_data {
  329.     uint8_t opcode;
  330.     uint8_t flags;
  331.     uint8_t rsvd2[2];
  332.     uint8_t rsvd3;
  333.     uint8_t dlength[3];
  334.     uint8_t lun[8];
  335.     itt_t     itt;
  336.     __be32    ttt;
  337.     __be32    rsvd4;
  338.     __be32    exp_statsn;
  339.     __be32    rsvd5;
  340.     __be32    datasn;
  341.     __be32    offset;
  342.     __be32    rsvd6;
  343.     /* Payload */
  344. };
  345.  
  346. /* SCSI Data Response Hdr */
  347. struct iscsi_data_rsp {
  348.     uint8_t opcode;
  349.     uint8_t flags;
  350.     uint8_t rsvd2;
  351.     uint8_t cmd_status;
  352.     uint8_t hlength;
  353.     uint8_t dlength[3];
  354.     uint8_t lun[8];
  355.     itt_t     itt;
  356.     __be32    ttt;
  357.     __be32    statsn;
  358.     __be32    exp_cmdsn;
  359.     __be32    max_cmdsn;
  360.     __be32    datasn;
  361.     __be32    offset;
  362.     __be32    residual_count;
  363. };
  364.  
  365. /* Data Response PDU flags */
  366. #define ISCSI_FLAG_DATA_ACK        0x40
  367. #define ISCSI_FLAG_DATA_OVERFLOW    0x04
  368. #define ISCSI_FLAG_DATA_UNDERFLOW    0x02
  369. #define ISCSI_FLAG_DATA_STATUS        0x01
  370.  
  371. /* Text Header */
  372. struct iscsi_text {
  373.     uint8_t opcode;
  374.     uint8_t flags;
  375.     uint8_t rsvd2[2];
  376.     uint8_t hlength;
  377.     uint8_t dlength[3];
  378.     uint8_t rsvd4[8];
  379.     itt_t     itt;
  380.     __be32    ttt;
  381.     __be32    cmdsn;
  382.     __be32    exp_statsn;
  383.     uint8_t rsvd5[16];
  384.     /* Text - key=value pairs */
  385. };
  386.  
  387. #define ISCSI_FLAG_TEXT_CONTINUE    0x40
  388.  
  389. /* Text Response Header */
  390. struct iscsi_text_rsp {
  391.     uint8_t opcode;
  392.     uint8_t flags;
  393.     uint8_t rsvd2[2];
  394.     uint8_t hlength;
  395.     uint8_t dlength[3];
  396.     uint8_t rsvd4[8];
  397.     itt_t     itt;
  398.     __be32    ttt;
  399.     __be32    statsn;
  400.     __be32    exp_cmdsn;
  401.     __be32    max_cmdsn;
  402.     uint8_t rsvd5[12];
  403.     /* Text Response - key:value pairs */
  404. };
  405.  
  406. /* Login Header */
  407. struct iscsi_login {
  408.     uint8_t opcode;
  409.     uint8_t flags;
  410.     uint8_t max_version;    /* Max. version supported */
  411.     uint8_t min_version;    /* Min. version supported */
  412.     uint8_t hlength;
  413.     uint8_t dlength[3];
  414.     uint8_t isid[6];    /* Initiator Session ID */
  415.     __be16    tsih;    /* Target Session Handle */
  416.     itt_t     itt;    /* Initiator Task Tag */
  417.     __be16    cid;
  418.     __be16    rsvd3;
  419.     __be32    cmdsn;
  420.     __be32    exp_statsn;
  421.     uint8_t rsvd5[16];
  422. };
  423.  
  424. /* Login PDU flags */
  425. #define ISCSI_FLAG_LOGIN_TRANSIT        0x80
  426. #define ISCSI_FLAG_LOGIN_CONTINUE        0x40
  427. #define ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK    0x0C    /* 2 bits */
  428. #define ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK    0x03    /* 2 bits */
  429.  
  430. #define ISCSI_LOGIN_CURRENT_STAGE(flags) \
  431.     ((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2)
  432. #define ISCSI_LOGIN_NEXT_STAGE(flags) \
  433.     (flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK)
  434.  
  435. /* Login Response Header */
  436. struct iscsi_login_rsp {
  437.     uint8_t opcode;
  438.     uint8_t flags;
  439.     uint8_t max_version;    /* Max. version supported */
  440.     uint8_t active_version;    /* Active version */
  441.     uint8_t hlength;
  442.     uint8_t dlength[3];
  443.     uint8_t isid[6];    /* Initiator Session ID */
  444.     __be16    tsih;    /* Target Session Handle */
  445.     itt_t     itt;    /* Initiator Task Tag */
  446.     __be32    rsvd3;
  447.     __be32    statsn;
  448.     __be32    exp_cmdsn;
  449.     __be32    max_cmdsn;
  450.     uint8_t status_class;    /* see Login RSP ststus classes below */
  451.     uint8_t status_detail;    /* see Login RSP Status details below */
  452.     uint8_t rsvd4[10];
  453. };
  454.  
  455. /* Login stage (phase) codes for CSG, NSG */
  456. #define ISCSI_INITIAL_LOGIN_STAGE        -1
  457. #define ISCSI_SECURITY_NEGOTIATION_STAGE    0
  458. #define ISCSI_OP_PARMS_NEGOTIATION_STAGE    1
  459. #define ISCSI_FULL_FEATURE_PHASE        3
  460.  
  461. /* Login Status response classes */
  462. #define ISCSI_STATUS_CLS_SUCCESS        0x00
  463. #define ISCSI_STATUS_CLS_REDIRECT        0x01
  464. #define ISCSI_STATUS_CLS_INITIATOR_ERR        0x02
  465. #define ISCSI_STATUS_CLS_TARGET_ERR        0x03
  466.  
  467. /* Login Status response detail codes */
  468. /* Class-0 (Success) */
  469. #define ISCSI_LOGIN_STATUS_ACCEPT        0x00
  470.  
  471. /* Class-1 (Redirection) */
  472. #define ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP    0x01
  473. #define ISCSI_LOGIN_STATUS_TGT_MOVED_PERM    0x02
  474.  
  475. /* Class-2 (Initiator Error) */
  476. #define ISCSI_LOGIN_STATUS_INIT_ERR        0x00
  477. #define ISCSI_LOGIN_STATUS_AUTH_FAILED        0x01
  478. #define ISCSI_LOGIN_STATUS_TGT_FORBIDDEN    0x02
  479. #define ISCSI_LOGIN_STATUS_TGT_NOT_FOUND    0x03
  480. #define ISCSI_LOGIN_STATUS_TGT_REMOVED        0x04
  481. #define ISCSI_LOGIN_STATUS_NO_VERSION        0x05
  482. #define ISCSI_LOGIN_STATUS_ISID_ERROR        0x06
  483. #define ISCSI_LOGIN_STATUS_MISSING_FIELDS    0x07
  484. #define ISCSI_LOGIN_STATUS_CONN_ADD_FAILED    0x08
  485. #define ISCSI_LOGIN_STATUS_NO_SESSION_TYPE    0x09
  486. #define ISCSI_LOGIN_STATUS_NO_SESSION        0x0a
  487. #define ISCSI_LOGIN_STATUS_INVALID_REQUEST    0x0b
  488.  
  489. /* Class-3 (Target Error) */
  490. #define ISCSI_LOGIN_STATUS_TARGET_ERROR        0x00
  491. #define ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE    0x01
  492. #define ISCSI_LOGIN_STATUS_NO_RESOURCES        0x02
  493.  
  494. /* Logout Header */
  495. struct iscsi_logout {
  496.     uint8_t opcode;
  497.     uint8_t flags;
  498.     uint8_t rsvd1[2];
  499.     uint8_t hlength;
  500.     uint8_t dlength[3];
  501.     uint8_t rsvd2[8];
  502.     itt_t     itt;    /* Initiator Task Tag */
  503.     __be16    cid;
  504.     uint8_t rsvd3[2];
  505.     __be32    cmdsn;
  506.     __be32    exp_statsn;
  507.     uint8_t rsvd4[16];
  508. };
  509.  
  510. /* Logout PDU flags */
  511. #define ISCSI_FLAG_LOGOUT_REASON_MASK    0x7F
  512.  
  513. /* logout reason_code values */
  514.  
  515. #define ISCSI_LOGOUT_REASON_CLOSE_SESSION    0
  516. #define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION    1
  517. #define ISCSI_LOGOUT_REASON_RECOVERY        2
  518. #define ISCSI_LOGOUT_REASON_AEN_REQUEST        3
  519.  
  520. /* Logout Response Header */
  521. struct iscsi_logout_rsp {
  522.     uint8_t opcode;
  523.     uint8_t flags;
  524.     uint8_t response;    /* see Logout response values below */
  525.     uint8_t rsvd2;
  526.     uint8_t hlength;
  527.     uint8_t dlength[3];
  528.     uint8_t rsvd3[8];
  529.     itt_t     itt;    /* Initiator Task Tag */
  530.     __be32    rsvd4;
  531.     __be32    statsn;
  532.     __be32    exp_cmdsn;
  533.     __be32    max_cmdsn;
  534.     __be32    rsvd5;
  535.     __be16    t2wait;
  536.     __be16    t2retain;
  537.     __be32    rsvd6;
  538. };
  539.  
  540. /* logout response status values */
  541.  
  542. #define ISCSI_LOGOUT_SUCCESS            0
  543. #define ISCSI_LOGOUT_CID_NOT_FOUND        1
  544. #define ISCSI_LOGOUT_RECOVERY_UNSUPPORTED    2
  545. #define ISCSI_LOGOUT_CLEANUP_FAILED        3
  546.  
  547. /* SNACK Header */
  548. struct iscsi_snack {
  549.     uint8_t opcode;
  550.     uint8_t flags;
  551.     uint8_t rsvd2[14];
  552.     itt_t     itt;
  553.     __be32    begrun;
  554.     __be32    runlength;
  555.     __be32    exp_statsn;
  556.     __be32    rsvd3;
  557.     __be32    exp_datasn;
  558.     uint8_t rsvd6[8];
  559. };
  560.  
  561. /* SNACK PDU flags */
  562. #define ISCSI_FLAG_SNACK_TYPE_MASK    0x0F    /* 4 bits */
  563.  
  564. /* Reject Message Header */
  565. struct iscsi_reject {
  566.     uint8_t opcode;
  567.     uint8_t flags;
  568.     uint8_t reason;
  569.     uint8_t rsvd2;
  570.     uint8_t hlength;
  571.     uint8_t dlength[3];
  572.     uint8_t rsvd3[8];
  573.     __be32  ffffffff;
  574.     uint8_t rsvd4[4];
  575.     __be32    statsn;
  576.     __be32    exp_cmdsn;
  577.     __be32    max_cmdsn;
  578.     __be32    datasn;
  579.     uint8_t rsvd5[8];
  580.     /* Text - Rejected hdr */
  581. };
  582.  
  583. /* Reason for Reject */
  584. #define ISCSI_REASON_CMD_BEFORE_LOGIN    1
  585. #define ISCSI_REASON_DATA_DIGEST_ERROR    2
  586. #define ISCSI_REASON_DATA_SNACK_REJECT    3
  587. #define ISCSI_REASON_PROTOCOL_ERROR    4
  588. #define ISCSI_REASON_CMD_NOT_SUPPORTED    5
  589. #define ISCSI_REASON_IMM_CMD_REJECT        6
  590. #define ISCSI_REASON_TASK_IN_PROGRESS    7
  591. #define ISCSI_REASON_INVALID_SNACK        8
  592. #define ISCSI_REASON_BOOKMARK_INVALID    9
  593. #define ISCSI_REASON_BOOKMARK_NO_RESOURCES    10
  594. #define ISCSI_REASON_NEGOTIATION_RESET    11
  595.  
  596. /* Max. number of Key=Value pairs in a text message */
  597. #define MAX_KEY_VALUE_PAIRS    8192
  598.  
  599. /* maximum length for text keys/values */
  600. #define KEY_MAXLEN        64
  601. #define VALUE_MAXLEN        255
  602. #define TARGET_NAME_MAXLEN    VALUE_MAXLEN
  603.  
  604. #define ISCSI_DEF_MAX_RECV_SEG_LEN        8192
  605. #define ISCSI_MIN_MAX_RECV_SEG_LEN        512
  606. #define ISCSI_MAX_MAX_RECV_SEG_LEN        16777215
  607.  
  608. #define ISCSI_DEF_FIRST_BURST_LEN        65536
  609. #define ISCSI_MIN_FIRST_BURST_LEN        512
  610. #define ISCSI_MAX_FIRST_BURST_LEN        16777215
  611.  
  612. #define ISCSI_DEF_MAX_BURST_LEN            262144
  613. #define ISCSI_MIN_MAX_BURST_LEN            512
  614. #define ISCSI_MAX_MAX_BURST_LEN            16777215
  615.  
  616. #define ISCSI_DEF_TIME2WAIT            2
  617.  
  618. /************************* RFC 3720 End *****************************/
  619.  
  620. #endif /* ISCSI_PROTO_H */
  621.